package fiuba.td.fabrica.model.factories;

import fiuba.td.fabrica.model.entities.Maquina;
import fiuba.td.fabrica.model.entities.MaquinaCalidad;
import fiuba.td.fabrica.model.entities.MaquinaProductora;
import fiuba.td.fabrica.model.exceptions.TipoMaquinaInvalidoException;
import fiuba.td.fabrica.model.vos.Tamanio;

public class MaquinaFactory {

	private static MaquinaFactory INSTANCE = null;
	public static final String MAQUINA_PRODUCTORA = "PRODUCTORA";
	public static final String MAQUINA_CALIDAD = "CALIDAD";
	
	private MaquinaFactory (){
	}
	 
    private synchronized static void createInstance() {
        if (INSTANCE == null) { 
            INSTANCE = new MaquinaFactory();
        }
    }
	 
    public static MaquinaFactory getInstance() {
        if (INSTANCE == null) createInstance();
        return INSTANCE;
    }

    /**
     * Crea una maquina en estado valido
     * @param tipo
     * @param nombre
     * @param costo
     * @param alto
     * @param ancho
     * @return
     * @throws TipoMaquinaInvalidoException
     */
	public Maquina createMaquinaReal (String tipo, String nombre, double costo, int alto, int ancho) throws TipoMaquinaInvalidoException{
		
		Tamanio tamanio = new Tamanio (alto, ancho);
		
		if (MAQUINA_PRODUCTORA.equalsIgnoreCase(tipo))
			return new MaquinaProductora (costo, nombre, tamanio);

		if (MAQUINA_CALIDAD.equalsIgnoreCase(tipo))
			return new MaquinaCalidad (costo, nombre, tamanio);
		
		throw new TipoMaquinaInvalidoException (
				"El tipo de maquina \"" + tipo +"\" de la maquina \"" + nombre + "\" no es valido." );
	}

	/**
	 * Crea una maquina para levantar el xml de la linea de produccion, donde solo viene indicado el nombre y el tipo
	 * @param tipo
	 * @param nombre
	 * @return
	 * @throws TipoMaquinaInvalidoException
	 */
	public Maquina createMaquinaLineaProduccion (String tipo, String nombre) throws TipoMaquinaInvalidoException{
		
		if (MAQUINA_PRODUCTORA.equalsIgnoreCase(tipo))
			return new MaquinaProductora (0.0, nombre, null);
		
		if (MAQUINA_CALIDAD.equalsIgnoreCase(tipo))
			return new MaquinaCalidad (0.0, nombre, null);
		
		throw new TipoMaquinaInvalidoException (
				"El tipo de maquina \"" + tipo +"\" de la maquina \"" + nombre + "\" no es valido." );
	}
}
